﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using ForrajeriaBCL;
using ForrajeriaDB;


/*
         * ***************************************************************************************************************** *
         *                                                                                                                   *
         *  ESTADO = 'A' ---------------------------------------------> CREADO Y PENDIENTE DE AUTORIZACION                   *
         *  ESTADO = 'B' ---------------------------------------------> AUTORIZADO                                           *
         *  ESTADO = 'C' ---------------------------------------------> FACTURADO                                            *
         *  ESTADO = 'D' ---------------------------------------------> DADO DE BAJA POR EL USUARIO                          *
         *  ESTADO = 'E' ---------------------------------------------> NO SE AUTORIZO Y LA FECHA DE HOY ES MAYOR A DESEADA  *
         *                                                                                                                   *
         * ***************************************************************************************************************** *                                                                                                      *
*/

namespace ForrajeriaFRONT
{
    public partial class Factura : System.Web.UI.Page
    {
        

        private FacturaBCL factBCL=new FacturaBCL(); 
        private FacturaMO factMO=new FacturaMO();
        private DetalleFacturaMO det;
        private GenericMO detalle;
        private List<GenericMO> listaDetalle;
        
        
       
        



        protected void Page_Load(object sender, EventArgs e)
        {

            detalle = new GenericMO();

            if (!Page.IsPostBack)
            {
                


                listaDetalle = null;
                listaDetalle = new List<GenericMO>();

                modoVentana("bloqueado");
                btnBuscarCliente.Enabled = true;
                btnBuscarForraje.Enabled = true;
                btnBuscarPedido.Enabled = true;
                btnDetalle.Enabled = true;
                ddlTipoFactura.Enabled = true;
                ddlTipoFactura.SelectedIndex = 1;
                Session["listaDetalle"] = listaDetalle;
               
            }
        }



        public void CleanControl(ControlCollection controles)
        {
            foreach (Control control in controles)
            {
                if (control is TextBox)
                    ((TextBox)control).Text = string.Empty;
                else if (control is DropDownList)
                    ((DropDownList)control).ClearSelection();
                else if (control is RadioButtonList)
                    ((RadioButtonList)control).ClearSelection();
                else if (control is CheckBoxList)
                    ((CheckBoxList)control).ClearSelection();
                else if (control is RadioButton)
                    ((RadioButton)control).Checked = false;
                else if (control is CheckBox)
                    ((CheckBox)control).Checked = false;
                else if (control.HasControls())
                    CleanControl(control.Controls);
            }
            txtTotal.Text = "0";
        }

        public void ControlState(ControlCollection controles, Boolean estado)
        {
            foreach (Control control in controles)
            {
                if (control is TextBox)
                    ((TextBox)control).Enabled = estado;
                else if (control is DropDownList)
                    ((DropDownList)control).Enabled = estado;
                else if (control is RadioButtonList)
                    ((RadioButtonList)control).Enabled = estado;
                else if (control is CheckBoxList)
                    ((CheckBoxList)control).Enabled = estado;
                else if (control is RadioButton)
                    ((RadioButton)control).Enabled = estado;
                else if (control is CheckBox)
                    ((CheckBox)control).Enabled = estado;
                else if (control.HasControls())
                    ControlState(control.Controls, estado);
            }
        }

        protected void modoVentana(string modo)
        {
            switch (modo)
            {
                case "nuevo":
                    CleanControl(this.Controls);
                    lblMensaje.Visible = false;
                    break;
                    lblMensaje.Visible = false;
                case "busqueda":
                    CleanControl(this.Controls);
                    ControlState(this.Controls, false);
                    lblMensaje.Visible = false;
                    break;
                case "edicion":
                    ControlState(this.Controls, true);
                    lblMensaje.Visible = false;
                    break;

                case "bloqueado":
                    CleanControl(this.Controls);
                    ControlState(this.Controls, false);
                    break;
                
            }
        }

       

        protected void cargarListaClientes()
        {
           
            
            List<GenericMO> listaCliente = factBCL.ClientesGetALL();

            string[,] mostrar = new string[3, 10];
            mostrar.Initialize();


            // CABECERA DE LAS COLUMNAS QUE SE MUESTRAN

            mostrar[0, 0] = "Numero de Cliente";
           
            mostrar[0, 2] = "Nombre";
            mostrar[0, 3] = "Apellido";
            mostrar[0, 4] = "Tipo de Documento";
            mostrar[0, 5] = "Numero de Documento";
           

            //COLUMNAS A MOSTRAR ---------- Se setea en 1 la columna 1 de las filas que queremos mostrar

            mostrar[1, 0] = "1";

            mostrar[1, 2] = "1";
            mostrar[1, 3] = "1";
            mostrar[1, 4] = "1";
            mostrar[1, 5] = "1";
           

            //CAMPOS DATAFIELD ---------- Todos los campos como se encuentrar en la base de datos

            mostrar[2, 0] = "Key1";
            mostrar[2, 1] = "Texto1";
            mostrar[2, 2] = "Texto2";
            mostrar[2, 3] = "Texto3";
            mostrar[2, 4] = "Texto4";
            mostrar[2, 5] = "Texto5";
            mostrar[2, 6] = "Texto6";
            mostrar[2, 7] = "Texto7";
            mostrar[2, 8] = "Texto8";
            mostrar[2, 9] = "Texto9";
            


            usrBusqueda.initi(listaCliente, mostrar, "GenericMO");
        }

        protected void cargarListaPedidos()
        {
           
            PedidoClienteBCL objpedido = new PedidoClienteBCL();
            List<PedidoClienteMO> listaPedido = objpedido.getByCliente(int.Parse(txtNroCliente.Text), "B");

            
            string[,] mostrar = new string[3, 7];
            mostrar.Initialize();


            // CABECERA DE LAS COLUMNAS QUE SE MUESTRAN

            mostrar[0, 0] = "Nro. Pedido";

            mostrar[0, 1] = "Fecha Pedido";
            mostrar[0, 5] = "Total Pedido";
            mostrar[0, 6] = "Fecha Autorizacion";
            


            //COLUMNAS A MOSTRAR ---------- Se setea en 1 la columna 1 de las filas que queremos mostrar

            mostrar[1, 0] = "1";

            mostrar[1, 1] = "1";
            mostrar[1, 5] = "1";
            mostrar[1, 6] = "1";
            


            //CAMPOS DATAFIELD ---------- Todos los campos como se encuentrar en la base de datos
            
            mostrar[2, 0] = "NroPedido";
            mostrar[2, 1] = "FechaPedidoString";
            mostrar[2, 2] = "FechaDeseadaString";
            mostrar[2, 3] = "Id_cliente";
            mostrar[2, 4] = "EstadoPedido";
            mostrar[2, 5] = "TotalPedido";
            mostrar[2, 6] = "FechaAutoString";
            


            usrBusqueda.initi(listaPedido, mostrar, "PedidoClienteMO");

        }

        protected void cargarListaForrajes()
        {
            List<GenericMO> lista = factBCL.ForrajesGetALL();

            //************* matriz que determina que columna se muestra y cual no *************************************

            string[,] mostrar = new string[3, 11];
            mostrar.Initialize();

            //CABECERA DE LAS COLUMNAS QUE SE MUESTRAN 

            mostrar[0, 0] = "Codigo Forraje";
            mostrar[0, 1] = "Codigo Forraje";
            mostrar[0, 2] = "Nombre Forraje";
            mostrar[0, 3] = "Stock Actual";
            mostrar[0, 4] = "Descripcion Forraje";
            mostrar[0, 5] = "Peso";
            mostrar[0, 6] = "Estado";
            mostrar[0, 7] = "PrecioXKilo";
            mostrar[0, 8] = "Edad";
            mostrar[0, 9] = "Marca";
            mostrar[0, 10] = "Descripcion Marca";

            //COLUMNAS A MOSTRAR
            mostrar[1, 0] = "1";//
            mostrar[1, 1] = "";
            mostrar[1, 2] = "1";//
            mostrar[1, 3] = "1";//
            mostrar[1, 4] = "";
            mostrar[1, 5] = "1";//
            mostrar[1, 6] = "";
            mostrar[1, 7] = "1";//
            mostrar[1, 8] = "1";//
            mostrar[1, 9] = "1";//
            mostrar[1, 10] = "";

            //CAMPOS DATAFIELD 
            mostrar[2, 0] = "Key1";
            mostrar[2, 1] = "Texto1";
            mostrar[2, 2] = "Texto2";
            mostrar[2, 3] = "Texto3";
            mostrar[2, 4] = "Texto4";
            mostrar[2, 5] = "Texto5";
            mostrar[2, 6] = "Texto6";
            mostrar[2, 7] = "Texto7";
            mostrar[2, 8] = "Texto8";
            mostrar[2, 9] = "Texto9";
            mostrar[2, 10] = "Texto10";



            //**********************************************************************************************************
            usrBusqueda.initi(lista, mostrar, "GenericMO");
        }

        protected void onRowSelected(Dictionary<string, string> objReto)
        {
            
            switch (ViewState["buscar"].ToString())
            {
               
                case "Forraje"://busco Forrajes
                    //det = null;
                    //det = new DetalleFacturaMO();
                    //det.Forraje = int.Parse(objReto["Key1"].ToString());
                    ViewState["detalle"] = "";
                    detalle = new GenericMO();
                    
                    detalle.Key1 = int.Parse(objReto["Key1"].ToString());
                    detalle.Texto8 = "";

                    txtMarca.Text = objReto["Texto9"];
                    txtEdad.Text = objReto["Texto8"];
                    txtForraje.Text = objReto["Texto2"];
                    txtDescripcion.Text = objReto["Texto4"];
                    txtPeso.Text = objReto["Texto5"];
                    txtPrecioXkilo.Text = objReto["Texto7"];

                    detalle.Texto1 = txtForraje.Text;

                    ViewState["detalle"] = detalle;
                    ViewState["buscar"]= "";
                    break;
                case "Pedido": //busco Pedidos
                    txtNroPedido.Text = objReto["NroPedido"];
                    cargarDetallesPorPedido();
                    ViewState["buscar"] = "";
                    break;

                case "Cliente": // busco Clientes
                   
                    factMO.CodigoCliente = int.Parse(objReto["Key1"]);
                   
                    txtNroCliente.Text = objReto["Key1"];
                    txtNombreCliente.Text = objReto["Texto2"];
                    txtApellidoCliente.Text = objReto["Texto3"];
                    txtDocumentoCliente.Text = objReto["Texto5"];
                    txtTipoDocumento.Text = objReto["Texto4"];



                    ViewState["buscar"] = "";
                    break;
            }
        }

        protected void cargarDetallesPorPedido()
        {
            
            List<GenericMO> lista = factBCL.DetallePedidoCliente(int.Parse(txtNroPedido.Text));

            foreach (GenericMO aux in lista)
            {
                aux.Texto8 = "P";
            }
           
            gv_detalles.DataSource = lista;
            gv_detalles.DataBind();
            Session["listaDetalle"] = lista;
            calcularTotal();
            gv_detalles.Visible = true;
        }
        protected void btnBuscarPedido_Click(object sender, EventArgs e)
        {

            Page.Validate("cliente");
            if (!Page.IsValid)
            { return; }
            //modoVentana("busqueda");
            ViewState["buscar"] = "Pedido";
            cargarListaPedidos();
            pnlModal_ModalPopupExtender.Show();
        }

        protected void btnBuscarCliente_Click(object sender, EventArgs e)
        {
           //modoVentana("busquedacliente");
            ViewState["buscar"] = "Cliente";
            cargarListaClientes();
            pnlModal_ModalPopupExtender.Show();
        }

        protected void btnBuscarForraje_Click(object sender, EventArgs e)
        {
            //modoVentana("busqueda");
            ViewState["buscar"] = "Forraje";
            cargarListaForrajes();
            pnlModal_ModalPopupExtender.Show();
            txtCantidad.Enabled = true;
        }

        protected void btnDetalle_Click(object sender, EventArgs e)
        {
            Page.Validate("forraje");
            if(!Page.IsValid)
            {
                return;
            }

            GenericMO detalle = new GenericMO();
            
            //det = new DetalleFacturaMO();
            //det.Cantidad=double.Parse(txtCantidad.Text);
            //det.Descripcion = txtForraje.Text;
            
            listaDetalle = (List<GenericMO>)Session["listaDetalle"];
            detalle = (GenericMO)ViewState["detalle"];

            
            detalle.Texto2 = txtCantidad.Text;
            detalle.Texto3 = txtPrecioXkilo.Text;
            detalle.Texto4 = (float.Parse(txtCantidad.Text) * float.Parse(txtPrecioXkilo.Text) * float.Parse(txtPeso.Text)).ToString();



            //det.NroLinea = listaDetalle.Count;

            foreach (GenericMO aux in listaDetalle)
            {
                if (aux.Key1 == detalle.Key1 && aux.Texto8 != "P")
                {

                    double cant = double.Parse(aux.Texto2.ToString());
                    cant += double.Parse(detalle.Texto2);
                    aux.Texto2 = cant.ToString();
                    detalle = null;
                }
            }

            if (detalle != null)
            {
                listaDetalle.Add(detalle);
            }
            Session["listaDetalle"] = listaDetalle;
            detalle = null;
            gv_detalles.DataSource = listaDetalle;
            gv_detalles.DataBind();
            calcularTotal();
            limpiarDetalle();
            gv_detalles.Visible = true;
        }

        protected void limpiarDetalle()
        {
            txtForraje.Text = "";
            txtMarca.Text = "";
            txtEdad.Text = "";
            txtPeso.Text = "";
            txtPrecioXkilo.Text = "";
            txtCantidad.Text = "";
            txtDescripcion.Text = "";

            
        }
        protected void gv_detalles_RowDeleting(object sender, GridViewDeleteEventArgs e)
        {
            listaDetalle = (List<GenericMO>)Session["listaDetalle"];
            int ind = e.RowIndex;

            string nombre = gv_detalles.DataKeys[ind].Value.ToString();
            
            GenericMO eliminar = new GenericMO();                
           
            foreach(GenericMO aux in listaDetalle)
            {
                
                if (aux.Key1.ToString() == nombre && aux.Texto8 != "P")
                {
                    eliminar = aux;
                }
            
            }

            if (eliminar.Key1 != 0)
            {
                listaDetalle.Remove(eliminar);
            }
            else
            {
                ViewState["quitaDetallePedido"] = false;
                Page.Validate("eliminar");
                return;
            }

            if (listaDetalle.Count == 0)
            {
                gv_detalles.DataSource = null;
                gv_detalles.DataBind();
                gv_detalles.Visible = false;
            }
            else
            {
                gv_detalles.DataSource = listaDetalle;
                gv_detalles.DataBind();
            }


            Session["listaDetalle"] = listaDetalle;
            calcularTotal();
        }

        protected void CustomValidator1_ServerValidate(object source, ServerValidateEventArgs args)
        {
            if (txtCantidad.Text == "")
            {
                args.IsValid = false;
            }
            else
            {
                args.IsValid = true;

            }
        }

        protected void CustomValidator2_ServerValidate(object source, ServerValidateEventArgs args)
        {

            if (txtForraje.Text == "")
            {
                args.IsValid = false;
            }
            else
            {
                args.IsValid = true;
            }

        }

        protected void CustomValidator3_ServerValidate(object source, ServerValidateEventArgs args)
        {
            if (txtNroCliente.Text == "")
            {
                args.IsValid = false;
            }
            else
            {
                args.IsValid = true;
            }
        }

        protected void calcularTotal()
        {
            listaDetalle = (List<GenericMO>)Session["listaDetalle"];
            double total;
            total = double.Parse(txtTotal.Text) ;


            foreach (GenericMO aux in listaDetalle)
            {
                total += double.Parse(aux.Texto4.ToString());
            }

            txtTotal.Text = total.ToString();
        }

        protected void btnNuevo_Click(object sender, EventArgs e)
        {
            modoVentana("nuevo");
            ViewState["detalle"] = "";
            listaDetalle = (List<GenericMO>)Session["listaDetalle"];
            listaDetalle.Clear();
            Session["listaDetalle"] = listaDetalle;
            gv_detalles.DataSource = null;
            gv_detalles.DataBind();
            gv_detalles.Visible = false;
        }

        protected void btnGuardar_Click(object sender, EventArgs e)
        {
         //   Page.Validate("cli");
            Page.Validate("detalle");
            if (!Page.IsValid) { return; }

            if (guardarFactura() == true)
            {
                lblMensaje.ForeColor = System.Drawing.Color.Blue;
                lblMensaje.Text = "Guardado Correctamente";
                lblMensaje.Visible = true;
            }
            else
            {
                lblMensaje.ForeColor = System.Drawing.Color.Red;
                lblMensaje.Text = "Error de Escritura en Base de Datos";
                lblMensaje.Visible = true;
            }
         
       

        }

        protected bool guardarFactura()
        {
            factBCL = new FacturaBCL();
            try
            {
                UsuarioBCL objUser = new UsuarioBCL();

                //************************* CREACION OBJETO FACTURA **********************************************************

                factMO = new FacturaMO();
                factMO.CodigoCliente = int.Parse(txtNroCliente.Text);

                UsuarioMO user = objUser.ComprobarDisponibilidad(Context.User.Identity.Name);

                if (user.CodigoEmpleado != null)
                    factMO.CodigoEmpleado = user.CodigoEmpleado;

                factMO.Fecha = DateTime.Today;
                if (txtNroPedido.Text != "")
                    factMO.NroPedido = int.Parse(txtNroPedido.Text);


                factMO.TipoFactura = ddlTipoFactura.Text;
                factMO.TotalFactura = double.Parse(txtTotal.Text);

                //************************************************************************************************************

                //************************ CREACION DETALLE FACTURA **********************************************************

                List<DetalleFacturaMO> listaDetalleFactura = new List<DetalleFacturaMO>();
                listaDetalle = (List<GenericMO>)Session["listaDetalle"];

                foreach (GenericMO aux in listaDetalle)
                {
                    DetalleFacturaMO detalle = new DetalleFacturaMO();


                    detalle.Precio = double.Parse(aux.Texto4) / double.Parse(aux.Texto2);
                    detalle.Forraje = aux.Key1;
                    detalle.Cantidad = double.Parse(aux.Texto2);
                    detalle.Descripcion = aux.Texto1;

                    listaDetalleFactura.Add(detalle);
                }

                //************************************************************************************************************
                factBCL.AdicionarFactura(factMO, listaDetalleFactura);
                return true;
            }
            catch
            {
                return false;
            }

        }

        protected void CustomValidator5_ServerValidate(object source, ServerValidateEventArgs args)
        {
            if (gv_detalles.Rows.Count == 0)
            {args.IsValid = false;}
            else
            { args.IsValid = true; }
        }

        protected void CustomValidator4_ServerValidate(object source, ServerValidateEventArgs args)
        {
            if (txtNroCliente.Text == "")
            { args.IsValid = false; }
            else { args.IsValid = true; }
        }

        protected void CustomValidator3_ServerValidate1(object source, ServerValidateEventArgs args)
        {
            if (txtNroCliente.Text == "")
            { args.IsValid = false; }
            else { args.IsValid = true; }
        }

        protected void CustomValidator4_ServerValidate1(object source, ServerValidateEventArgs args)
        {
            bool aux = (bool)ViewState["quitaDetallePedido"];
            args.IsValid = aux;
        }

        protected void CustomValidator6_ServerValidate(object source, ServerValidateEventArgs args)
        {
            GenericMO detalle = (GenericMO)ViewState["detalle"];
            if (detalle != null)
            {
                double stock = 0;
                ForrajeBCL objbcl = new ForrajeBCL();
                ForrajeMO vali = objbcl.getById(detalle.Key1);
                List<GenericMO> listaDetalle = (List<GenericMO>)Session["listaDetalle"];
                if (listaDetalle != null)
                {
                    foreach (GenericMO aux in listaDetalle)
                    {
                        if (aux.Key1 == detalle.Key1)
                        {
                            stock = double.Parse(aux.Texto2);
                        }
                    }
                }
                else
                    stock = 0;

                if (vali.StockActual < (stock + double.Parse(txtCantidad.Text)))
                    args.IsValid = false;
                else
                    args.IsValid = true;
            }
        }

        
    }
}